css: Move computing of initial and inherit values
authorBenjamin Otte <otte@redhat.com>
Tue, 17 Jul 2012 12:01:52 +0000 (14:01 +0200)
committerBenjamin Otte <otte@redhat.com>
Tue, 28 Aug 2012 13:40:57 +0000 (15:40 +0200)
... to the compute vfunc. Simplifies code quite a bit. But makes the
code no longer a simple step-by-step implementation of the spec.

gtk/gtkcsscomputedvalues.c
gtk/gtkcssinheritvalue.c
gtk/gtkcssinheritvalueprivate.h
gtk/gtkcssinitialvalue.c
gtk/gtkcssinitialvalueprivate.h

index caa2251d1b72eb571712ab3d3b9a5dfc78e80c88..7aa121f0237ff4462e9c3e1eb64b23116262261c 100644 (file)
@@ -90,15 +90,10 @@ _gtk_css_computed_values_compute_value (GtkCssComputedValues *values,
                                         GtkCssValue          *specified,
                                         GtkCssSection        *section)
 {
-  GtkCssStyleProperty *prop;
-  GtkStyleContext *parent;
 
   g_return_if_fail (GTK_IS_CSS_COMPUTED_VALUES (values));
   g_return_if_fail (GTK_IS_STYLE_CONTEXT (context));
 
-  prop = _gtk_css_style_property_lookup_by_id (id);
-  parent = gtk_style_context_get_parent (context);
-
   gtk_css_computed_values_ensure_array (values, id + 1);
 
   /* http://www.w3.org/TR/css3-cascade/#cascade
@@ -106,65 +101,19 @@ _gtk_css_computed_values_compute_value (GtkCssComputedValues *values,
    * by following this pseudo-algorithm:
    * 1) Identify all declarations that apply to the element
    */
-  if (specified != NULL)
-    {
-      if (_gtk_css_value_is_inherit (specified))
-        {
-          /* 3) if the value of the winning declaration is ‘inherit’,
-           * the inherited value (see below) becomes the specified value.
-           */
-          specified = NULL;
-        }
-      else if (_gtk_css_value_is_initial (specified))
-        {
-          /* if the value of the winning declaration is ‘initial’,
-           * the initial value (see below) becomes the specified value.
-           */
-          specified = _gtk_css_style_property_get_initial_value (prop);
-        }
-
-      /* 2) If the cascading process (described below) yields a winning
-       * declaration and the value of the winning declaration is not
-       * ‘initial’ or ‘inherit’, the value of the winning declaration
-       * becomes the specified value.
-       */
-    }
-  else
+  if (specified == NULL)
     {
+      GtkCssStyleProperty *prop = _gtk_css_style_property_lookup_by_id (id);
+
       if (_gtk_css_style_property_is_inherit (prop))
-        {
-          /* 4) if the property is inherited, the inherited value becomes
-           * the specified value.
-           */
-          specified = NULL;
-        }
+        specified = _gtk_css_inherit_value_new ();
       else
-        {
-          /* 5) Otherwise, the initial value becomes the specified value.
-           */
-          specified = _gtk_css_style_property_get_initial_value (prop);
-        }
-    }
-
-  if (specified == NULL && parent == NULL)
-    {
-      /* If the ‘inherit’ value is set on the root element, the property is
-       * assigned its initial value. */
-      specified = _gtk_css_style_property_get_initial_value (prop);
-    }
-
-  if (specified)
-    {
-      g_ptr_array_index (values->values, id) = _gtk_css_value_compute (specified, id, context);
+        specified = _gtk_css_initial_value_new ();
     }
   else
-    {
-      GtkCssValue *parent_value;
-      /* Set NULL here and do the inheritance upon lookup? */
-      parent_value = _gtk_style_context_peek_property (parent, id);
+    _gtk_css_value_ref (specified);
 
-      g_ptr_array_index (values->values, id) = _gtk_css_value_ref (parent_value);
-    }
+  g_ptr_array_index (values->values, id) = _gtk_css_value_compute (specified, id, context);
 
   if (section)
     {
@@ -175,6 +124,8 @@ _gtk_css_computed_values_compute_value (GtkCssComputedValues *values,
 
       g_ptr_array_index (values->sections, id) = gtk_css_section_ref (section);
     }
+  
+  _gtk_css_value_unref (specified);
 }
                                     
 void
index 614abe1125c1ba52011f6c9cdf0ff2c46ee0ea37..6faeef3c84a0867e835885c4e78309aaa65ac3db 100644 (file)
@@ -19,6 +19,9 @@
 
 #include "gtkcssinheritvalueprivate.h"
 
+#include "gtkcssstylepropertyprivate.h"
+#include "gtkstylecontextprivate.h"
+
 struct _GtkCssValue {
   GTK_CSS_VALUE_BASE
 };
@@ -35,8 +38,14 @@ gtk_css_value_inherit_compute (GtkCssValue     *value,
                                guint            property_id,
                                GtkStyleContext *context)
 {
-  /* This value should be caught further up */
-  g_return_val_if_reached (_gtk_css_value_ref (value));
+  GtkStyleContext *parent = gtk_style_context_get_parent (context);
+
+  if (parent)
+    return _gtk_css_value_ref (_gtk_style_context_peek_property (parent, property_id));
+  else
+    return _gtk_css_value_compute (_gtk_css_style_property_get_initial_value (_gtk_css_style_property_lookup_by_id (property_id)),
+                                   property_id,
+                                   context);
 }
 
 static gboolean
@@ -76,11 +85,3 @@ _gtk_css_inherit_value_new (void)
 {
   return _gtk_css_value_ref (&inherit);
 }
-
-gboolean
-_gtk_css_value_is_inherit (const GtkCssValue *value)
-{
-  g_return_val_if_fail (value != NULL, FALSE);
-
-  return value == &inherit;
-}
index 768aea2d843c901bcce6ce08e4cd9e759686fc44..ae69a6b7cf7abbb487b03ee8740cecece93b017e 100644 (file)
@@ -26,8 +26,6 @@ G_BEGIN_DECLS
 
 GtkCssValue *   _gtk_css_inherit_value_new            (void);
 
-gboolean        _gtk_css_value_is_inherit             (const GtkCssValue          *value);
-
 G_END_DECLS
 
 #endif /* __GTK_CSS_INHERIT_VALUE_PRIVATE_H__ */
index 24955c3b5899304ee63b371aa4641ed627804d69..7bebbc87d7a13342aa217348c55c29374a38b6d6 100644 (file)
@@ -19,6 +19,8 @@
 
 #include "gtkcssinitialvalueprivate.h"
 
+#include "gtkcssstylepropertyprivate.h"
+
 struct _GtkCssValue {
   GTK_CSS_VALUE_BASE
 };
@@ -35,8 +37,9 @@ gtk_css_value_initial_compute (GtkCssValue     *value,
                                guint            property_id,
                                GtkStyleContext *context)
 {
-  /* This value should be caught further up */
-  g_return_val_if_reached (_gtk_css_value_ref (value));
+  return _gtk_css_value_compute (_gtk_css_style_property_get_initial_value (_gtk_css_style_property_lookup_by_id (property_id)),
+                                 property_id,
+                                 context);
 }
 
 static gboolean
@@ -76,11 +79,3 @@ _gtk_css_initial_value_new (void)
 {
   return _gtk_css_value_ref (&initial);
 }
-
-gboolean
-_gtk_css_value_is_initial (const GtkCssValue *value)
-{
-  g_return_val_if_fail (value != NULL, FALSE);
-
-  return value == &initial;
-}
index 19c39ed66607f52bd1774a82767a3526ec20b37a..cee931034b3dd33834826b26cba4c0491d83fafd 100644 (file)
@@ -26,8 +26,6 @@ G_BEGIN_DECLS
 
 GtkCssValue *   _gtk_css_initial_value_new            (void);
 
-gboolean        _gtk_css_value_is_initial             (const GtkCssValue          *value);
-
 G_END_DECLS
 
 #endif /* __GTK_CSS_INITIAL_VALUE_PRIVATE_H__ */